package org.aileen.blog.controller;

import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.aileen.blog.model.BlogInfo;
import org.aileen.blog.service.BlogService;
import org.aileen.blog.utils.JWTUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.Assert;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;
@Slf4j
@RequestMapping("/blog")
@RestController
public class BlogController {
    @Autowired
    private BlogService blogService;

    // 获取博客列表
    @RequestMapping("/getList")
    public List<BlogInfo> getList(){
        return blogService.getList();
    }

    /**
     * 获取博客详情
     * @param blogId 博客ID
     * @return 返回博客的详细信息
     */
    @RequestMapping("/getBlogDetail")
    public BlogInfo getBlogDetail(Integer blogId , HttpServletRequest request){
        log.info("getBlogDetail 接收参数, blogId:"+blogId);
        Assert.notNull(blogId, "blogId不能为空");
        // blogId不为空 , 调用Service层的getBlogDetail方法获取博客的详细信息
        BlogInfo blogInfo = blogService.getBlogDetail(blogId);
        //1.根据博客信息获取到用户的ID
        Integer authorId = blogInfo.getUserId();
        //2.根据Token获取到当前登录用户的ID->Token从客户端获取令牌之后再次发起的请求中获取
        String userToken = request.getHeader("user_token_header");
            //从Token中获取登录用户的Id
        Integer userId = JWTUtils.getUserIdFromToken(userToken);
        if(authorId != null && authorId == userId){
            blogInfo.setIsLoginUser(true); // 如果当前登录用户的ID和博客作者的ID相同,则设置isLoginUser为true
        }

        return  blogInfo; // 返回博客的详细信息
    }


    /**
     * 发布博客
     * 后端需要返回用户的ID,然后客户端将ID发送给前端,前端再次发送用户请求时就会携带这个ID
     * 然后当用户插入数据点击
     */
    @RequestMapping("/add")
    public Boolean addBlog(@Validated @RequestBody BlogInfo blogInfo , HttpServletRequest request){
        log.info("addBlog 接收参数 , blogInfo : {} ", blogInfo);
        //从 token 中获取UserId
        String userToken = request.getHeader("user_token_header");
        //从 Token 中获取 UserId
        Integer userId = JWTUtils.getUserIdFromToken(userToken);
        //然后将 UserId 设置到 blogInfo 中,这样后端插入blogInfo时就能插入到正确的UserId下了
        blogInfo.setUserId(userId);
        //定义一个变量记录更新结果的条数
        Integer result = null;
        //调用Service层的addBlog方法添加博客
        try{
            result = blogService.insertBlog(blogInfo);
            if(result == 1){
                return true; // 插入成功
            }
        }catch(Exception e){
            log.error("发布博客失败, e ",e);
        }
        return false; // 插入失败
    }

    /**
     * 更新博客->直接执行数据库
     */
    @RequestMapping("/update")
    public Boolean updateBlog(@Validated @RequestBody BlogInfo blogInfo){
        log.info("updateBlog 接收参数: " + blogInfo);
        Integer result = null;
        try{
            result = blogService.updates(blogInfo);
            if(result >= 1){
                return true; // 更新成功
            }
        }catch(Exception e){
            log.error("updateBlog 发生异常 , e "+e);
        }
        return false; // 更新失败
    }

    /**
     *
     *删除博客
     */
    @RequestMapping("/delete")
    public Boolean deleteBlog(Integer  blogId){
        log.info("deleteBlog 接收参数, blogId: " + blogId);
        Assert.notNull(blogId, "blogId不能为空");
        Integer result = null;
        try{
            BlogInfo blogInfo = new BlogInfo();
            blogInfo.setId(blogId);
            blogInfo.setDeleteFlag(1); // 设置删除标志为1
            result = blogService.updates(blogInfo); // 调用更新方法
            if(result >= 1){
                return true; // 删除成功
            }
        }catch(Exception e){
            log.error("deleteBlog 发生异常 , e: " + e);
        }
        return false; // 删除失败
    }
}



